/**
 * commitlint 配置文件，规范 commit 提交信息
 * 适用范围：本项目所有 git commit
 * 扩展说明：如需新增 type 或 scope，请同步修改 typeList 和 excludeDirs
 */
import type { UserConfig } from 'cz-git';
import fs from 'fs';
import path from 'path';

// 动态获取 src 目录下的所有文件夹名作为 scope 选项，自动同步项目结构
const excludeDirs = ['assets', 'utils', 'types'];
const typeList = [
  'feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test',
  'build', 'ci', 'chore', 'revert', 'wip', 'workflow', 'type', 'release'
];
const scopes = (() => {
  try {
    return fs
      .readdirSync(path.resolve(__dirname, 'src'), { withFileTypes: true })
      .filter(dirent => dirent.isDirectory() && !excludeDirs.includes(dirent.name))
      .map(dirent => dirent.name.replace(/s$/, ''));
  } catch {
    return ['other'];
  }
})();

// 多语言支持：根据环境变量 COMMIT_LANG 选择中英文
let promptMessages, promptTypes;
console.log(process.env.COMMIT_LANG, '============');

try {
  if (process.env.COMMIT_LANG === 'zh') {
    // eslint-disable-next-line @typescript-eslint/no-var-requires
    const zh = require('./locales/commit.zh');
    promptMessages = zh.messages;
    promptTypes = zh.types;
  } else {
    // eslint-disable-next-line @typescript-eslint/no-var-requires
    const en = require('./locales/commit.en');
    promptMessages = en.messages;
    promptTypes = en.types;
  }
} catch (e) {
  // fallback: 默认英文
  // eslint-disable-next-line @typescript-eslint/no-var-requires
  const en = require('./locales/commit.en');
  promptMessages = en.messages;
  promptTypes = en.types;
}

const config: UserConfig = {
  // 忽略包含 'init' 的提交，不做校验
  ignores: [commit => commit.includes('init')],
  // 继承社区主流的 Conventional Commits 规范
  extends: ['@commitlint/config-conventional'],
  // 自定义 commit 校验规则
  rules: {
    // body 前必须空一行
    'body-leading-blank': [2, 'always'],
    // footer 前建议空一行
    'footer-leading-blank': [1, 'always'],
    // header 最长 108 字符
    'header-max-length': [2, 'always', 108],
    // subject 不能为空
    'subject-empty': [2, 'never'],
    // type 不能为空
    'type-empty': [2, 'never'],
    // 不限制 subject 的大小写
    'subject-case': [0],
    // 限定 type 可选值
    'type-enum': [2, 'always', typeList]
  },
  // cz-git 交互式提交的自定义提示和选项
  prompt: {
    messages: promptMessages,
    types: promptTypes,
    // 是否使用 emoji
    useEmoji: true,
    // 自动生成的 scope 选项
    scopes: [...scopes],
    // 自定义 scope 选项对齐方式
    customScopesAlign: "bottom",
    // 空 scope 的别名
    emptyScopesAlias: "empty",
    // 自定义 scope 的别名
    customScopesAlias: "custom",
    // 允许哪些 type 有 breaking changes
    allowBreakingChanges: ["feat", "fix"]
  }
};

export default config;